package contract.jvm;

import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;

import java.util.HashMap;
import java.util.Map;

/**
 * 方法区
 */
public class MethodArea {

    /**
     * 类保存在这个Map中
     */
    private final Map<String, ClassNode> classes = new HashMap<>();

    /**
     * 方法保存在这个Map中
     */
    private final Map<String, MethodNode> methods = new HashMap<>();

    /**
     * 保存类
     */
    public void saveClass(ClassNode classNode) {
        classes.put(classNode.name, classNode);
        for (MethodNode method : classNode.methods) {
            String methodFullName = methodFullName(classNode.name, method.name, method.desc);
            methods.put(methodFullName, method);
        }
    }

    /**
     * 获取类
     */
    public ClassNode getClass(String className) {
        return classes.get(className);
    }

    /**
     * 获取方法
     */
    public MethodNode getMethod(String className, String methodName, String methodDesc) {
        String methodFullName = methodFullName(className, methodName, methodDesc);
        return methods.get(methodFullName);
    }

    /**
     * 方法全名
     */
    public static String methodFullName(String className, String methodName, String methodDesc) {
        return className + "." + methodName + methodDesc;
    }

}
